package backing;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpSession;

import DAO.AbstractDAO;
import DAO.BancoDAO;
import DAO.CidadeDAO;
import DAO.ContaCorrenteDAO;
import DAO.EstadoDAO;
import DAO.FuncionarioDAO;
import DAO.LaboratorioDAO;
import to.Banco;
import to.Cidade;
import to.ContaCorrente;
import to.Estado;
import to.Funcionario;
import to.Laboratorio;
import to.Usuario;
import util.JSFUtil;

@ManagedBean
@ViewScoped
public class ContaCorrenteBacking {
	private ContaCorrente contaCorrenteSalvar = new ContaCorrente();
	private ContaCorrente contaCorrenteSelecionada = null;
	private Banco banco = new Banco();
	private DataModel<Banco> listaBanco;
	private DataModel<ContaCorrente> listaContaCorrente;
	private Laboratorio laboratorioSession = null;

	private ArrayList<Estado> listaEstados;
	private ArrayList<Cidade> listaCidades;
	private Integer estadoSalvar;
	private Integer cidadeSalvar;

	AbstractDAO abstractDAO = new AbstractDAO();
	LaboratorioDAO laboratorioDAO = new LaboratorioDAO();
	BancoDAO bancoDAO = new BancoDAO();
	ContaCorrenteDAO contaCorrenteDAO = new ContaCorrenteDAO();
	FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
	EstadoDAO estadoDAO = new EstadoDAO();
	CidadeDAO cidadeDAO = new CidadeDAO();
	public ContaCorrenteBacking(){

	}
	public void salvar(){
		try {
			ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();  
			HttpSession session = (HttpSession) externalContext.getSession(true);  
			Usuario usuario= (Usuario)session.getAttribute("currentUser"); 
			Funcionario funcionario = funcionarioDAO.pesquisarFuncionarioUsuario(usuario);
			laboratorioSession = funcionario.getLaboratorio();

			if(laboratorioSession != null){

				contaCorrenteSalvar.setLaboratorio(laboratorioSession);	
				contaCorrenteSalvar.setBanco(banco);
				contaCorrenteSalvar.setCidade(cidadeDAO.buscarCidadePorCodigo(cidadeSalvar));
				abstractDAO.saveOrUpdate(contaCorrenteSalvar);
				if(contaCorrenteSelecionada != null){
					JSFUtil.addInfoMessage("Alterada com sucesso");
				}else{
					JSFUtil.addInfoMessage("Salva com sucesso");
				}
			}else{
				JSFUtil.addErrorMessage("Erro ao salvar.");
				JSFUtil.addWarnMessage("Tente novamente.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			this.reset();
		}

	}
	public void delete(){
		if(contaCorrenteSelecionada != null){
			try {
				abstractDAO.delete(contaCorrenteSelecionada);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else{
			JSFUtil.addWarnMessage("Tente novamente.");
		}
	}

	public void reset() {
		contaCorrenteSalvar = new ContaCorrente();
		contaCorrenteSelecionada = null;
		banco = new Banco();
		listaBanco = null;
		listaContaCorrente =null;
		laboratorioSession = null;
	}

	public void carregaBanco() {
		try {
			listaBanco = new ListDataModel<Banco>( bancoDAO.buscarTodos());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void preparaAlteracao(){
		if(contaCorrenteSelecionada != null){
			contaCorrenteSalvar = contaCorrenteSelecionada;
			this.carregarEstados();
			estadoSalvar = contaCorrenteSelecionada.getCidade().getEstado().getCodigo();
			this.carregarCidades();
			cidadeSalvar = contaCorrenteSelecionada.getCidade().getCodigo();
		}
	}

	@PostConstruct
	public void carregarEstados() {
		try {
			listaEstados = (ArrayList<Estado>) estadoDAO.buscaTodos();
		} catch (Exception e) {
			JSFUtil.addInfoMessage("ERRO AO CARREGAR ESTADOS");
		}
	}

	public void carregarCidades(){
		System.out.println("Cidades CArregadas");
		try {
			listaCidades = (ArrayList<Cidade>) cidadeDAO
					.pesquisarCidadesPorEstado(estadoSalvar);
		} catch (Exception e) {
			JSFUtil.addInfoMessage("ERRO AO CARREGAR CIDADES");
		}
	}

	public void carregarConta(){
		try {
			ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();  
			HttpSession session = (HttpSession) externalContext.getSession(true);  
			Usuario usuario= (Usuario)session.getAttribute("currentUser"); 
			Funcionario funcionario = funcionarioDAO.pesquisarFuncionarioUsuario(usuario);
			laboratorioSession = funcionario.getLaboratorio();

			listaContaCorrente = new ListDataModel<ContaCorrente>(contaCorrenteDAO.buscarPorLaboratorio(laboratorioSession));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public ContaCorrente getContaCorrenteSalvar() {
		return contaCorrenteSalvar;
	}
	public void setContaCorrenteSalvar(ContaCorrente contaCorrenteSalvar) {
		this.contaCorrenteSalvar = contaCorrenteSalvar;
	}
	public ContaCorrente getContaCorrenteSelecionada() {
		return contaCorrenteSelecionada;
	}
	public void setContaCorrenteSelecionada(ContaCorrente contaCorrenteSelecionada) {
		this.contaCorrenteSelecionada = contaCorrenteSelecionada;
	}
	public Banco getBanco() {
		return banco;
	}
	public void setBanco(Banco banco) {
		this.banco = banco;
	}
	public DataModel<Banco> getListaBanco() {
		return listaBanco;
	}
	public void setListaBanco(DataModel<Banco> listaBanco) {
		this.listaBanco = listaBanco;
	}
	public DataModel<ContaCorrente> getListaContaCorrente() {
		return listaContaCorrente;
	}
	public void setListaContaCorrente(DataModel<ContaCorrente> listaContaCorrente) {
		this.listaContaCorrente = listaContaCorrente;
	}
	public Laboratorio getLaboratorioSession() {
		return laboratorioSession;
	}
	public void setLaboratorioSession(Laboratorio laboratorioSession) {
		this.laboratorioSession = laboratorioSession;
	}
	public ArrayList<Estado> getListaEstados() {
		return listaEstados;
	}
	public void setListaEstados(ArrayList<Estado> listaEstados) {
		this.listaEstados = listaEstados;
	}
	public ArrayList<Cidade> getListaCidades() {
		return listaCidades;
	}
	public void setListaCidades(ArrayList<Cidade> listaCidades) {
		this.listaCidades = listaCidades;
	}
	public Integer getEstadoSalvar() {
		return estadoSalvar;
	}
	public void setEstadoSalvar(Integer estadoSalvar) {
		this.estadoSalvar = estadoSalvar;
	}
	public Integer getCidadeSalvar() {
		return cidadeSalvar;
	}
	public void setCidadeSalvar(Integer cidadeSalvar) {
		this.cidadeSalvar = cidadeSalvar;
	}

}
